#ifndef UTILS_H
#define UTILS_H

#include <QByteArray>
#include <QString>
#include <QSerialPort>
#include <QObject>

class Utils : public QObject
{
public:
    enum Com_Sta
    {
        COM_OK,
        COM_ERR
    };

    enum Frame
    {
        STR1,		//68H
        ADR0,		//地址0
        ADR1,		//地址1
        ADR2,		//地址2
        ADR3,		//地址3
        ADR4,		//地址4
        ADR5,		//地址5
        STR2,		//68H
        CMD,		//命令字
        LEN,		//长度
        DI0,		//标识码0
        DI1,		//标识码1
        DI2,		//标识码2
        DI3,		//标识码3
        DAT0,		//数据0
        DAT1,		//数据1
        DAT2,		//数据2
        DAT3,		//数据3
        DAT4,		//数据4
        DAT5,		//数据5
        DAT6,		//数据6
        DAT7,		//数据7
        DAT8,		//数据8
        DAT9,		//数据9
        DAT10,		//数据10
        DAT11,		//数据11
        DAT12,		//数据12
        DAT13,		//数据13
        DAT14,		//数据14
        DAT15,		//数据15
        DAT16,		//数据16
        DAT17,		//数据17
        DAT18,		//数据18
        DAT19,		//数据19
        DAT20,		//数据20
        DAT21,		//数据21
        DAT22,		//数据22
        DAT23,		//数据23
        DAT24,		//数据24
        DAT25,		//数据25
        DAT26,		//数据26
        DAT27,		//数据27
        DAT28,		//数据28
        DAT29		//数据29
    };

    const QByteArray Frame_Header = QByteArray("\x68\xAA\xAA\xAA\xAA\xAA\xAA\x68\x00\x00", 10);
    static Utils* instance();
    static QByteArray calculateChecksum(QByteArray arr);
//    static QByteArray add33(QByteArray arr);
//    static QByteArray sub33(QByteArray arr);
    static void Frameadd33(QByteArray& arr);
    static void Framesub33(QByteArray& arr);
    static QByteArray add33(const QByteArray& input);
    static QByteArray sub33(const QByteArray& input);
    static QString StringAddSpace(QString str);
    static QByteArray hexStringToByteArray(const QString& hexString);
    static QByteArray reverseByteArray(const QByteArray& input);
    static QByteArray createCommandFrame(unsigned char cmd,QByteArray id,unsigned char dataLen,QByteArray data);
    static QByteArray createCommandFrameNoDI(unsigned char cmd,unsigned char dataLen,QByteArray data);
    static QByteArray doubleToBCDArray3Dot3(double value);
    static QByteArray decimalStringToBcd(const QString &decimalStr);
    static double bcdArrayToDouble3Dot3(const QByteArray& bcd);
    static int bcdToInt(const QByteArray& bcd);
    static QByteArray intToBcd(int number, int minBytes = 0);
    static QByteArray stringToBCD(const QString& decimalString);

    // 将BCD数据转换为字符串，默认小数点前后各3位（NNN.NNN）
    static QString bcdToDecimalString(const QByteArray &bcd, int decimalDigits = 3);

//    QString getSerialPortName();
//    void setSerialPortName(QString name);

    QSerialPort::DataBits getSerialPortDataBits();
    void setSerialPortDataBit(QSerialPort::DataBits);

    QSerialPort::Parity getSerialPortParity();
    void setSerialPortParity(QSerialPort::Parity);

    QSerialPort::StopBits getSerialPortStopBits();
    void setSerialPortStopBits(QSerialPort::StopBits);

    QSerialPort::BaudRate getSerialBaudRate();
    void setSerialBaudRate(QSerialPort::BaudRate b);

    int getTimeOutMs();
    void setTimeOutMs(int timeout);

    QByteArray getPwdLevel();
    void setPwdLevel(QByteArray l);

    QByteArray getPwd();
    void setPwd(QByteArray pwd);

    QByteArray getAddress();
    void setAddress(QByteArray a);

    bool isSub33();
    void setSub33(bool b);

    static QString m_portName;                          // 串口名称，比如 "COM3" 或 "/dev/ttyUSB0"
private:
    explicit Utils(QObject* parent=nullptr);
    bool m_Flag_Sub33;
    //串口配置参数

    QSerialPort::BaudRate m_baudRate = QSerialPort::Baud9600;    // 波特率，默认9600
    QSerialPort::DataBits m_dataBits = QSerialPort::Data8;     // 数据位，默认8位
    QSerialPort::Parity m_parity = QSerialPort::NoParity;      // 校验位，默认无校验
    QSerialPort::StopBits m_stopBits = QSerialPort::OneStop;   // 停止位，默认1位
    //QSerialPort::FlowControl flowControl = QSerialPort::NoFlowControl;  // 流控，默认无流控

    // 可选扩展，比如超时时间（毫秒）
    int m_readTimeoutMs = 800;   // 读取超时时间，默认800ms
    //密码等级
    QByteArray m_pwdLevel=QByteArray::fromHex("02");
    QByteArray m_pwd=QByteArray::fromHex("000000");
    QByteArray m_addres=QByteArray::fromHex("111111111111");
};

#endif // UTILS_H
